package com.yh.utils;

/**
 * 存放常量数据
 * 上传参数说明 1024 B(简称：字节) = 1 KB ； 1024 KB = 1 MB ； 1024 MB = 1 GB
 *
 * @author yuhuan
 * @date 2022/01/13
 */
public class Constants {
    /**
     * 通用分隔符（通常用于持久化数据）
     */
    public static final String DELIMITER = ",";
    /**
     * 数据连接符（通常用于临时数据处理。如：用于创建和解析座位的定位符号）
     */
    public static final String DATA_JOINER = "~";
    /**
     * 客户端服务的统一访问路径
     */
    public static final String CLIENT_PATH = "api";
    /**
     * 处理日期格式（如：8月9号 8/9到08/09）补齐零位的零界值
     */
    public static final int ZERO_BOUND = 10;
    /**
     * 在线的数据（表示上架的影片或计划）
     */
    public static final String ON_LINE = "up";
    /**
     * 下线的数据（表示下架的影片或计划）
     */
    public static final String OFF_LINE = "down";
    /**
     * 不存在的ID
     */
    public static final int NOT_EXIST_ID = 0;
    /**
     * 数据状态-常规数据（没有被标记为删除的数据）
     */
    public static final int ACTIVE_DATA = 0;
    /**
     * 数据状态-被删除的数据
     */
    public static final int INERT_DATA = 1;

    /**
     * 有关影厅的常量信息
     */
    public static class HallData {
        /**
         * 影厅的初始容量
         */
        public static final int INITIAL_CAPACITY = 0;
    }

    /**
     * 处理文件上传的相关常量
     */
    public static class FileData {
        /**
         * 限制上传文件的大小。单位: 字节
         */
        public static final long MAX_FILE_SIZE = 1 * 1024 * 1024;
        /**
         * 设置上传请求中,数据的总大小限制。单位: 字节
         */
        public static final long MAX_REQUEST_SIZE = 5 * 1024 * 1024;
        /**
         * 如果文件的大小超过该阈值，文件将会被写出到磁盘。单位: 字节
         */
        public static final int FILE_SIZE_THRESHOLD = 100 * 1024;
        /**
         * 文件上传的默认地址
         */
        public static final String FILE_LOCATION = "E:/file-upload-library";
    }

    /**
     * 搜索引擎常量信息
     */
    public static class ElasticsearchData {
        /**
         * 储存影片要点信息的索引的名字
         */
        public static final String INDEX_NAME = "movie_index";
    }

    /**
     * 消息队列常量信息
     */
    public static class RabbitMqData {
        /**
         * 预热队列名称
         */
        public static final String PREHEAT_QUEUE_NAME = "preheat_queue";
        /**
         * 预热交换机名称
         */
        public static final String PREHEAT_EXCHANGE_NAME = "preheat_exchange";
        /**
         * 预热队列和预热交换机的路由KEY
         */
        public static final String PREHEAT_BINDING_KEY = "preheat";
        /**
         * 支付队列名称
         */
        public static final String PAY_QUEUE_NAME = "pay_queue";
        /**
         * 支付交换机名称
         */
        public static final String PAY_EXCHANGE_NAME = "pay_exchange";
        /**
         * 支付队列和支付交换机的路由KEY
         */
        public static final String PAY_BINDING_KEY = "pay";
        /**
         * 订单队列名称
         */
        public static final String ORDER_QUEUE_NAME = "order_queue";
        /**
         * 订单交换机名称
         */
        public static final String ORDER_EXCHANGE_NAME = "order_exchange";
        /**
         * 订单队列和订单交换机的路由KEY
         */
        public static final String ORDER_BINDING_KEY = "order";
        /**
         * 延时队列名称
         */
        public static final String DELAY_QUEUE_NAME = "delay_queue";
        /**
         * 延时交换机名称
         */
        public static final String DELAY_EXCHANGE_NAME = "delay_exchange";
        /**
         * 延时队列和延时交换机的路由KEY
         */
        public static final String DELAY_BINDING_KEY = "delay";
    }

    /**
     * 消息类型
     */
    public static class MqMessageData {
        /**
         * 标记为删除的消息
         */
        public static final String DEL_MESSAGE = "DEL_MESSAGE";
        /**
         * 标记为修改的消息
         */
        public static final String UPDATA_MESSAGE = "UPDATA_MESSAGE";
        /**
         * 标记为添加的消息
         */
        public static final String ADD_MESSAGE = "ADD_MESSAGE";
    }

    /**
     * 影片信息常量
     */
    public static class MovieData {
        /**
         * 高分影片参考评分
         */
        public static final double HIGH_SCORE_VIDEOS = 5.0;
        /**
         * 触发检索所有信息的关键字
         */
        public static final String OFF_KEY_WORD = "全部";
        /**
         * 未设置影片主演时的默认显示信息
         */
        public static final String NULL_MOVIE_STAR = "暂定";
        /**
         * 排序条件，根据上映时间排序
         */
        public static final int REORDER_OF_TIME = 2;
        /**
         * 排序条件，根据用户评分排序
         */
        public static final int REORDER_OF_SCORE = 3;
        /**
         * 根据时间排序的属性
         */
        public static final String REORDER_OF_TIME_IN_FIELD = "movieReleaseYear";
        /**
         * 根据评分排序的属性
         */
        public static final String REORDER_OF_SCORE_IN_FIELD = "movieScore";
        /**
         * 限制上传海报的大小。单位: 字节
         */
        public static final long MAX_FILE_SIZE = 1 * 1024 * 1024;
        /**
         * 设置上传请求中,数据的总大小限制。单位: 字节
         */
        public static final long MAX_REQUEST_SIZE = 5 * 1024 * 1024;
        /**
         * 如果文件的大小超过该阈值，文件将会被写出到磁盘。单位: 字节
         */
        public static final int FILE_SIZE_THRESHOLD = 100 * 1024;
        /**
         * 海报上传的默认地址
         */
        public static final String FILE_LOCATION = "E:/file-upload-library";
    }

    /**
     * 场次常量
     */
    public static class ScheduleData {
        /**
         * 随机影厅ID的缓存KEY，用于生产随机播放计划
         */
        public static final String RANDOM_ID_KEY = "update:schedule:hall:pop:id";
        /**
         * 随机放映时间的缓存KEY，用于生产随机播放计划
         */
        public static final String RANDOM_TIME_KEY = "update:schedule:hall:pop:time";
        /**
         * 放映时间的KEY，用于获取和储存放映时间
         */
        public static final String SHOW_TIME_KEY = "showTime";
        /**
         * 结束时间的KEY，用于获取和储存散场时间
         */
        public static final String END_TIME_KEY = "endTime";
        /**
         * 为了方便开发工作，将浏览器传递的影片放映时间定格在指定日期
         */
        public static final String DEVELOP_TEST_TIME = "2021/11/28";
        /**
         * 影片播放的状态 - 片场还没开始
         */
        public static final String NOT_STARTED = "not_started";
        /**
         * 影片播放的状态 - 片场正在放映
         */
        public static final String SHOWING = "showing";
        /**
         * 影片播放的状态 - 片场已经结束
         */
        public static final String END_SHOW = "end_show";
        /**
         * 日程的最大保留时间（单位：天）
         */
        public static final int RESERVE_EFFECTIVE_TIME = 30;
        /**
         * 相对于今天的偏移量（方便日期的计算）
         */
        public static final int FIRST_DAY = 0;
        public static final int THE_SECOND_DAY = 1;
        public static final int THE_THIRD_DAY = 2;
        public static final int THE_FORTH_DAY = 3;
        public static final int THE_FIRFTH_DAY = 4;
    }

    /**
     * 座位布局常量
     */
    public static class SeatLayoutData {
        /**
         * 标记为不存在的座位
         */
        public static final String NULL_SEAT = "0";
        /**
         * 标记为已经被售出的座位
         */
        public static final String SOLD_SEAT = "1";
        /**
         * 标记为待出售的座位
         */
        public static final String SELECTABLE_SEAT = "2";
    }

    /**
     * 订单状态常量
     */
    public static class OrderData {
        /**
         * 退票中的状态
         */
        public static final int REFUNDING = 0;
        /**
         * 无法退票
         */
        public static final int UNABLE_REFUN = -1;
        /**
         * 待支付
         */
        public static final int WAIT_PAY = 1;
        /**
         * 已支付
         */
        public static final int COMPLETE_PAY = 2;
        /**
         * 退票成功
         */
        public static final int COMPLETE_REFUN = 3;
        /**
         * 订单的有效时间（单位：分钟）
         */
        public static final int ORDER_EFFECTIVE_TIME = 5;
        /**
         * 幂等性等待时间（单位：秒）
         */
        public static final long IDEMPOTENCY_WAIT_TIME = 32L;
        /**
         * 幂等性操作权限的限制时间（单位：秒）
         */
        public static final long IDEMPOTENCY_EXPIRE_TIME = 30L;
        /**
         * 影片开播前无法退款的时间段，默认30分钟（单位：分）
         */
        public static final long FREEZE_TIME = 30L;
    }

    /**
     * 登录常量
     */
    public static class LoginData {
        /**
         * 用户登录信息的缓存KEY前缀，用于拼接用户信息在缓存中的唯一键
         */
        public static final String LOGIN_DATA_PREFIX_KEY = "login";
        /**
         * 普通用户权限
         */
        public static final int USER_ROLE = 0;
        /**
         * 管理员权限
         */
        public static final int ADMIN_ROLE = 1;
        /**
         * 超级管理员权限
         */
        public static final int ROOT_ROLE = 2;
        /**
         * 开发者权限
         */
        public static final int DEVELOPER_ROLE = 3;
        /**
         * 登录信息的过期时间(单位：分钟)
         */
        public static final int LOGIN_EXPIRE_TIME = 30;
    }

    /**
     * 分页默认参数
     */
    public static class PageParam {
        /**
         * 默认的当前页
         */
        public static final Integer PAGE_NUM = 1;
        /**
         * 默认的页面大小
         */
        public static final Integer PAGE_SIZE = 5;
    }

    /**
     * 区间标识，用于识别应该创建哪种类型的响应模型
     */
    public static class ResponseVoType {
        /**
         * 创建通用响应的标识区间
         */
        public static final int[] RESP_SHARED_TYPE = {200, 299};
        /**
         * 创建验证响应的标识区间
         */
        public static final int[] RESP_VALIDATOR_TYPE = {100, 199};
        /**
         * 创建用户响应的标识区间
         */
        public static final int[] RESP_USER_TYPE = {500, 599};
        /**
         * 创建订单响应的标识区间
         */
        public static final int[] RESP_ORDER_TYPE = {400, 499};
        /**
         * 创建搜索响应的标识区间
         */
        public static final int[] RESP_SEARCH_TYPE = {300, 399};
    }

    /**
     * 用于标记ResponseVO的响应状态
     * <p>
     * 通用VO状态 - 标记区间（200~299）
     * 搜索VO状态 - 标记区间（300~399）
     * 用户模块的VO状态 - 标记区间（500~599）
     * 订单模块的VO状态 - 标记区间（400~499）
     */
    public static class ResponseDataState {
        /**
         * 通用VO状态；代表成功响应。
         */
        public static final int RESP_SUCCESS = 200;
        /**
         * 通用VO状态；代表空结果响应。
         */
        public static final int NULL_RESULT = 201;
        /**
         * 通用VO状态；代表数据更新失败
         */
        public static final int UPDATE_FAIL = 220;
        /**
         * 通用VO状态；代表数据更新失败（细分标识，原因是数据已经存在）
         */
        public static final int UPDATE_FAIL_EXIST = 221;
        /**
         * 通用VO状态；代表数据删除失败（统一标识）
         */
        public static final int DELETE_FAIL = 230;
        /**
         * 通用VO状态；代表删除数据失败（细分标识，原因是数据被占用）
         */
        public static final int DATA_IS_OCCUPIED = 231;


        /**
         * 用户VO状态，代表空账号响应
         */
        public static final int NULL_ACCOUNT = 501;
        /**
         * 用户VO状态，代表密码错误
         */
        public static final int PASSWORD_ERROR = 510;
        /**
         * 用户VO状态，代表非法登录
         */
        public static final int ILLEGAL_LOGIN = 511;
        /**
         * 用户VO状态，代表登录信息过期
         */
        public static final int LOGIN_EXPIRED = 512;
        /**
         * 用户VO状态，代表账户已经被注册
         */
        public static final int EXIST_ACCOUNT = 513;


        /**
         * 订单VO状态，代表支付成功
         */
        public static final int PAY_SUCCESS = 400;
        /**
         * 订单VO状态，代表订单创建失败
         */
        public static final int FAILURE_ORDER = 410;
        /**
         * 订单VO状态，代表支付失败（原因是订单重复支付）
         */
        public static final int PAY_FAIL_OF_REPEAT = 421;
        /**
         * 订单VO状态，代表支付失败（原因是订单到期未付款）
         */
        public static final int PAY_FAIL_OF_EXPIRE = 422;
        /**
         * 订单VO状态，代表删除订单失败（原因是正在删除退款订单）
         */
        public static final int DELETE_FAIL_OF_REFUNDING = 431;


        /**
         * 搜索VO状态；代表索引创建失败
         */
        public static final int INDEX_INIT_FAIL = 311;
        /**
         * 搜索VO状态；代表索引删除失败
         */
        public static final int INDEX_DELETE_FAIL = 321;
    }

    /**
     * 用于标识数据的验证结果；同时，可用于标记ResponseVO的响应状态。标记区间（100~199）
     */
    public static class ValidatorResult {
        /**
         * 通过验证的数据
         */
        public static final int DATA_PASS = 100;
        /**
         * 空的数据
         */
        public static final int NULL_VALUE = 101;
        /**
         * 邮箱格式错误
         */
        public static final int EMAIL_ERROR = 110;
        /**
         * 手机格式错误
         */
        public static final int MOBILE_ERROR = 111;
    }
}
